package com.boil.util;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by ChenYong on 2016-09-21.
 * <br>
 * 文件工具类。
 */
public final class FileUtils {
    /**
     * 图片类型 Map
     */
    public static final Map<String, String> IMAGE_FILE_TYPE_MAP = new HashMap<String, String>();
    /**
     * 媒体（音频/视频）类型 Map
     */
    public static final Map<String, String> MEDIA_FILE_TYPE_MAP = new HashMap<String, String>();
    /**
     * 动画类型 Map
     */
    public static final Map<String, String> FLASH_FILE_TYPE_MAP = new HashMap<String, String>();
    /**
     * 图片大小的最大值 5MB
     */
    public static final long IMAGE_LENGTH_MAX_SIZE = 5 * 1024 * 1024;
    /**
     * 媒体（音频/视频）大小的最大值 50MB
     */
    public static final long MEDIA_LENGTH_MAX_SIZE = 50 * 1024 * 1024;
    /**
     * 动画大小的最大值 50MB
     */
    public static final long FLASH_LENGTH_MAX_SIZE = 50 * 1024 * 1024;

    // 静态初始化块
    static {
        IMAGE_FILE_TYPE_MAP.put("jpe", "image/jpeg");
        IMAGE_FILE_TYPE_MAP.put("jpg", "image/jpeg");
        IMAGE_FILE_TYPE_MAP.put("bmp", "image/bmp");
        IMAGE_FILE_TYPE_MAP.put("gif", "image/gif");
        IMAGE_FILE_TYPE_MAP.put("png", "image/png");
        IMAGE_FILE_TYPE_MAP.put("ico", "image/ico");
        IMAGE_FILE_TYPE_MAP.put("jpeg", "image/jpeg");

        MEDIA_FILE_TYPE_MAP.put("rm", "video/rm");
        MEDIA_FILE_TYPE_MAP.put("avi", "video/avi");
        MEDIA_FILE_TYPE_MAP.put("rmvb", "video/rmvb");
        MEDIA_FILE_TYPE_MAP.put("mp3", "audio/mp3");
        MEDIA_FILE_TYPE_MAP.put("wma", "audio/x-ms-wma");

        FLASH_FILE_TYPE_MAP.put("swf", "application/x-shockwave-flash");
    }

    /**
     * 获取文件的后缀名（后缀名）。
     * <ol>
     * <li>如果文件名为空，则返回空串；</li>
     * <li>如果文件名为空串，则返回空串；</li>
     * <li>如果文件名不包含“.”，则返回空串；</li>
     * <li>否则，返回后缀名。</li>
     * </ol>
     *
     * @param fileName 文件名
     * @return 后缀名
     */
    public static String getFileSuffix(String fileName) {
        if (StringUtils.isBlank(fileName) || (!fileName.contains(Constants.POINT_CHAR))) {
            return Constants.EMPTY_STR;
        }

        return fileName.substring(fileName.lastIndexOf(Constants.POINT_CHAR) + 1).toLowerCase();
    }

    /**
     * 获取新文件名，此文件名是由“UUID + 后缀名”组成。
     *
     * @param oldFileName 旧文件名
     * @return 新文件名
     */
    public static String getNewFileName(String oldFileName) {
        return Utils.getUuid() + Constants.POINT_CHAR + getFileSuffix(oldFileName);
    }

    /**
     * 获取不包括后缀名的文件名称。
     *
     * @param fileName 文件名称
     * @return 不包括后缀名的文件名称
     */
    public static String getFileNameNoSuffix(String fileName) {
        if (StringUtils.isBlank(fileName) || (!fileName.contains(Constants.POINT_CHAR))) {
            return Constants.EMPTY_STR;
        }

        return fileName.substring(Constants.VALUE_0, fileName.lastIndexOf(Constants.POINT_CHAR));
    }

    /**
     * 判断文件是否为图片。
     *
     * @param fileType 文件类型
     * @return 是否为图片：
     * <ol>
     * <li>true：是；</li>
     * <li>false：否。</li>
     * </ol>
     */
    public static boolean isImage(String fileType) {
        return IMAGE_FILE_TYPE_MAP.containsValue(fileType);
    }

    /**
     * 判断文件是否为媒体（音频/视频）。
     *
     * @param fileType 文件类型
     * @return 是否为媒体：
     * <ol>
     * <li>true：是；</li>
     * <li>false：否。</li>
     * </ol>
     */
    public static boolean isMedia(String fileType) {
        return MEDIA_FILE_TYPE_MAP.containsValue(fileType);
    }

    /**
     * 判断文件是否为动画。
     *
     * @param fileType 文件类型
     * @return 是否为动画：
     * <ol>
     * <li>true：是；</li>
     * <li>false：否。</li>
     * </ol>
     */
    public static boolean isFlash(String fileType) {
        return FLASH_FILE_TYPE_MAP.containsValue(fileType);
    }

    /**
     * 获取图片的所有后缀名用逗号“,”拼接的字符串。
     *
     * @return 图片的所有后缀名用逗号“,”拼接的字符串
     */
    public static String getImageSuffixs() {
        return Utils.parseList2Str(new ArrayList<String>(IMAGE_FILE_TYPE_MAP.keySet()), Constants.COMMA_CHAR);
    }

    /**
     * 获取媒体（音频/视频）的所有后缀名用逗号“,”拼接的字符串。
     *
     * @return 媒体（音频/视频）的所有后缀名用逗号“,”拼接的字符串
     */
    public static String getMediaSuffixs() {
        return Utils.parseList2Str(new ArrayList<String>(MEDIA_FILE_TYPE_MAP.keySet()), Constants.COMMA_CHAR);
    }

    /**
     * 获取动画的所有后缀名用逗号“,”拼接的字符串。
     *
     * @return 动画的所有后缀名用逗号“,”拼接的字符串
     */
    public static String getFlashSuffixs() {
        return Utils.parseList2Str(new ArrayList<String>(FLASH_FILE_TYPE_MAP.keySet()), Constants.COMMA_CHAR);
    }

    /**
     * 判断文件是否为 Excel 文件。
     *
     * @param fileName 文件名称
     * @return 是否为 Excel 文件：
     * <ol>
     * <li>true：是；</li>
     * <li>false：否。</li>
     * </ol>
     */
    public static boolean isExcel(String fileName) {
        String suffix = getFileSuffix(fileName);

        if (Constants.SUFFIX_XLS.equals(suffix) || (Constants.SUFFIX_XLSX.equals(suffix))) {
            return true;
        }

        return false;
    }
}